﻿Imports System.Data.OleDb
Imports System.Data.SqlClient

Module K1

    '   Clipboard.SetText(MySQL) ' 変数の値をクリップボードにコピー

    Public 著作 As String = "著作権：物流技術研究所 寺本敏幸 作成：2026/03/20"

    Public 画面Chk As Integer = 0
#Region "ベース版出荷データ"

    Public モデル連番 As Integer
    Public ベースE数 As Integer
    Public ベースI数 As Integer
    Public ベースキー数 As Integer
    Public ベースPL数 As Integer
    Public N(164) As Double
    Public 全計算回数 As Integer

    Public Const EMin比率 As Double = 0.5
    Public Const IMin比率 As Double = 0.5
    Public Const EMax比率 As Double = 1.5
    Public Const IMax比率 As Double = 1.5

    Public Min出荷先数 As Integer
    Public Minアイテム数 As Integer
    Public Max出荷先数 As Integer
    Public Maxアイテム数 As Integer
    Public E計算範囲 As Integer
    Public I計算範囲 As Integer

    Public Eレコードピッチ1 As Double
    Public Iレコードピッチ1 As Double
    Public E計算回数1 As Integer
    Public I計算回数1 As Integer
    Public 全計算回数1 As Integer
    Public レコードピッチChk1 As Integer = 0
    Public モデルレコード数Chk1 As Integer = 0

    Public Eレコードピッチ2 As Double
    Public Iレコードピッチ2 As Double
    Public E計算回数2 As Integer
    Public I計算回数2 As Integer
    Public 全計算回数2 As Integer
    Public レコードピッチChk2 As Integer = 0
    Public モデルレコード数Chk2 As Integer = 0

    Public 計算条件 As Integer = 1

    Public データ抽出区分 As String
    Public ETable As String
    Public ITable As String
    Public ランクキー As String
    Public キーLabel As String

#End Region

#Region "T250_進行テーブル"
    Public 進行連番 As Integer
    Public 作成Chk As String
    Public 計算E数 As Integer
    Public 計算I数 As Integer
    Public E採用判定値 As Double
    Public I採用判定値 As Double
    Public seed1 As Integer = 12345 '再現性のランス発生設置値
    Public seed2 As Integer = 22345 '再現性のランス発生設置値
    Public E採用判定値Chk As Integer = 0
    Public I採用判定値Chk As Integer = 0
    Public T250_進行レコードMax As Integer = 0
#End Region

#Region "  ファイルパス"
    Public TeraDB As String         'Tera計算.accdb
    Public MyDB As String           'EIQ_AIモデル.accdb
    Public ShippingExcel As String  '出荷データ.xlsx
    Public ShippingSheet As String  '出荷データのシート名'

    Public MyTable As String        'DBテーブル、使いまわします    
    Public MyExcel As String        'Excel名、使いまわします    
    Public Mysheet As String        'Excelのシート名、使いまわします    

    Public MySQL As String          'SQL文、使いまわします    
    Public MyDgv As DataGridView    'Dgv名、使いまわします    

    Public T200_Chk As Integer
    Public 出荷データ_Chk As Integer
    Public T230_ケースバラ全集計_Chk As Integer


    Public Tera計算DataPath As String
    Public SoftDataPath As String

    Public Sub フォルダー確認()
        Dim chk As Integer = 0
        'フォルダーの存在確認 System.IO.Directory.Exists()
        If System.IO.Directory.Exists("A:\Tera計算Data") Then Tera計算DataPath = "A:\Tera計算Data" : chk += 1
        If System.IO.Directory.Exists("B:\Tera計算Data") Then Tera計算DataPath = "B:\Tera計算Data" : chk += 1
        If System.IO.Directory.Exists("C:\Tera計算Data") Then Tera計算DataPath = "C:\Tera計算Data" : chk += 1
        If System.IO.Directory.Exists("D:\Tera計算Data") Then Tera計算DataPath = "D:\Tera計算Data" : chk += 1
        If System.IO.Directory.Exists("E:\Tera計算Data") Then Tera計算DataPath = "E:\Tera計算Data" : chk += 1
        If System.IO.Directory.Exists("F:\Tera計算Data") Then Tera計算DataPath = "F:\Tera計算Data" : chk += 1

        If chk = 0 Then
            MsgBox("[Tera計算Data]フォルダーが存在しません,[Tera計算Data]を任意のドライブに複写")
            End
        ElseIf chk >= 2 Then
            MsgBox("[Tera計算Data]フォルダーが複数存在、1つにしてください。終了します")
            End
        End If

        'ファイルパス
        TeraDB = Tera計算DataPath & "\Tera計算.accdb"
        MyDB = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        ShippingExcel = Tera計算DataPath & "\出荷データ.xlsx"
        ShippingSheet = "sheet1"

    End Sub
    Public Sub EIQ分析AI化フォルダー作成()
        Dim fso As Object
        Dim parentPath As String
        Dim targetFolderName As String
        Dim fullPath As String

        '--- 設定エリア ---
        ' 1. 親フォルダのパスを指定してください（最後は \ で終わらなくてもOK）
        parentPath = Tera計算DataPath

        ' 2. 作成したいフォルダ名
        targetFolderName = "EIQ分析AI化"
        '------------------

        ' フルパスの組み立て
        If Right(parentPath, 1) <> "\" Then
            fullPath = parentPath & "\" & targetFolderName
        Else
            fullPath = parentPath & targetFolderName
        End If

        ' FileSystemObjectの作成
        fso = CreateObject("Scripting.FileSystemObject")

        ' フォルダの存在チェック
        If fso.FolderExists(fullPath) Then
            ' すでに存在する場合：何もしない（メッセージ表示などは任意）
            ' MsgBox "フォルダは既に存在します。"
        Else
            ' 存在しない場合：フォルダを作成
            On Error Resume Next
            fso.CreateFolder(fullPath)

            If Err.Number = 0 Then
                MsgBox("「" & targetFolderName & "」フォルダを作成しました。", vbInformation)
            Else
                MsgBox("フォルダ作成に失敗しました。パスが正しいか確認してください。", vbCritical)
            End If
            On Error GoTo 0
        End If

        ' 後片付け
        fso = Nothing
    End Sub

#End Region
#Region "My_DATA11"
    'My_DATA11
    Public 設定者 As String   '作成者
    Public DB名 As String
    Public エクセル名 As String
    Public エクセルシート名 As String
    Public テーブル名 As String
    Public ランク設定対象 As String
    Public ケース出荷ランクキー As String
    Public バラ出荷ランクキー As String
    Public 分析日 As String
    Public ランク記号 As String
    Public ランクA1 As Double
    Public ランクA2 As Double
    Public ランクB As Double
    Public ランクC As Double
    Public ランクD As Double
    Public ABC_ARunk As Double
    Public ABC_BRunk As Double
    Public ABC_CRunk As Double


    Public SK As String       '作成対象（全出荷日 or 出荷日指定）
    Public koumoku As String  '分析項目（出荷先 or アイテム）
    Public CRK As String      'ケース出荷ランクキー（C行・ケース・PL数・容積のいずれかを設定）
    Public BRK As String      'バラ出荷ランクキー（バラ出荷  の行数・ケース・PL数・容積のいずれかを設定）
    Public CRK記号 As String  'フィールド名・ランク設定に使用
    Public BRK記号 As String  'フィールド名・ランク設定に使用
    Public RA1 As Integer     'ランク比率
    Public RA2 As Integer     'ランク比率
    Public RB As Integer      'ランク比率
    Public RC As Integer      'ランク比率
    Public RD As Integer      'ランク比率

    'Tp cHK
    Public TpChk1 As Integer = 0

    Public Property Cn As SqlConnection

#End Region

    Public EIQ_A1ランク As Integer = 50
    Public EIQ_A2ランク As Integer = 20
    Public EIQ_Bランク As Integer = 15
    Public EIQ_Cランク As Integer = 10
    Public EIQ_Dランク As Integer = 5

#Region "My_DATA1テーブル”

    Public Sub My_DATA1テーブル作成()
        ' MyDB に接続して My_DATA11 テーブルが無ければ作成する
        Try
            Dim cst As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MyDB
            Using con As New OleDbConnection(cst)
                con.Open()
                Dim schema As DataTable = con.GetSchema("Tables")
                For Each r As DataRow In schema.Rows
                    If r("TABLE_TYPE").ToString().ToUpper() = "TABLE" AndAlso
                       r("TABLE_NAME").ToString().ToLower() = "my_data11" Then
                        ' 既に存在するので作成不要
                        Return
                    End If
                Next
            End Using

            ' テーブルが無い場合は作成する
            Dim 設定者 As String = "Tera"
            ケース出荷ランクキー = "Cケ"
            バラ出荷ランクキー = "B行"
            ランクA1 = 50
            ランクA2 = 20
            ランクB = 15
            ランクC = 10
            ランクD = 5

            Dim sb As New System.Text.StringBuilder()
            sb.Append("SELECT ")
            sb.Append("""" & 設定者 & """" & " As 設定者,")
            sb.Append("""" & 分析日 & """" & " As 分析日,")
            sb.Append("""" & ケース出荷ランクキー & """" & " As ケース出荷ランクキー,")
            sb.Append("""" & バラ出荷ランクキー & """" & " As バラ出荷ランクキー,")
            sb.Append(ランクA1 & " As ランクA1,")
            sb.Append(ランクA2 & " As ランクA2,")
            sb.Append(ランクB & " As ランクB,")
            sb.Append(ランクC & " As ランクC,")
            sb.Append(ランクD & " As ランクD ")
            sb.Append("INTO My_DATA11;")

            SQL実行(sb.ToString())
        Catch ex As Exception
            MsgBox("My_DATA1テーブル作成でエラー: " & ex.Message)
        End Try
    End Sub

    Public Sub My_DATA1読込()
        Dim dbCon As OleDbConnection
        Dim dbCmd As OleDbCommand
        dbCon = New OleDbConnection()
        Dim cst As String = ""
        cst &= "Provider=Microsoft.ACE.OLEDB.12.0;"
        cst = cst & "Data Source=" & MyDB
        dbCon.ConnectionString = cst
        dbCon.Open()

        Dim dtTbl As New DataTable
        dbCmd = New OleDbCommand("SELECT My_DATA11.* FROM My_DATA11;", dbCon)
        Dim dbAdp As New OleDbDataAdapter(dbCmd)
        dbAdp.Fill(dtTbl)

        K1.設定者 = dtTbl.Rows(0)("設定者").ToString()
        ケース出荷ランクキー = dtTbl.Rows(0)("ケース出荷ランクキー").ToString()
        バラ出荷ランクキー = dtTbl.Rows(0)("バラ出荷ランクキー").ToString()
        分析日 = dtTbl.Rows(0)("分析日").ToString()
        ランクA1 = CDbl(dtTbl.Rows(0)("ランクA1").ToString)
        ランクA2 = CDbl(dtTbl.Rows(0)("ランクA2").ToString)
        ランクB = CDbl(dtTbl.Rows(0)("ランクB").ToString)
        ランクC = CDbl(dtTbl.Rows(0)("ランクC").ToString)
        ランクD = CDbl(dtTbl.Rows(0)("ランクD").ToString)

        ' ACCESS DB クローズ
        dbCon.Close()
        dbCon.Dispose()
    End Sub
    Public Sub My_DATA2作成()
        DEL_table("My_DATA2*")
        ' 接続文字列（パスは環境に合わせて変更してください）
        Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MyDB & ";"

        Using conn As New OleDbConnection(connStr)
            Try
                conn.Open()

                ' 列名にスペースや特殊文字（=など）が含まれる場合は [] で囲む必要があります
                Dim sql As String = "CREATE TABLE My_DATA2 (" &
                                "[データ抽出区分] TEXT(50), " &
                                "[ETable] TEXT(100), " &
                                "[ITable] TEXT(100), " &
                                "[ランクキー] TEXT(50), " &
                                "[キーLabel] TEXT(50), " &
                                "[ベースE数] INTEGER, " &
                                "[Min出荷先数] INTEGER, " &
                                "[Max出荷先数] INTEGER, " &
                                "[ベースI数] INTEGER, " &
                                "[Minアイテム数] INTEGER, " &
                                "[Maxアイテム数] INTEGER)"

                Using cmd As New OleDbCommand(sql, conn)
                    cmd.ExecuteNonQuery()
                    Console.WriteLine("テーブル 'My_DATA2' を作成しました。")
                End Using

            Catch ex As Exception
                Console.WriteLine("エラー: " & ex.Message)
            End Try
        End Using
    End Sub
    Public Sub My_DATA2更新(データ抽出区分 As String, ETable As String, ITable As String, ランクキー As String, キーLabel As String, ベースE数 As Integer, Min出荷先数 As Integer, Max出荷先数 As Integer, ベースI数 As Integer, Minアイテム数 As Integer, Maxアイテム数 As Integer)
        ' 接続文字列（パスは環境に合わせて変更してください）
        Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MyDB & ";"

        Using conn As New OleDbConnection(connStr)
            Try
                conn.Open()

                ' 1. まずデータが存在するか確認
                Dim checkSql As String = "SELECT COUNT(*) FROM My_DATA2"
                Dim existCount As Integer
                Using cmdCheck As New OleDbCommand(checkSql, conn)
                    existCount = Convert.ToInt32(cmdCheck.ExecuteScalar())
                End Using

                Dim sql As String
                If existCount = 0 Then
                    ' データがない場合は INSERT
                    sql = "INSERT INTO My_DATA2 ([データ抽出区分], [ETable], [ITable], [ランクキー], [キーLabel], [ベースE数], [Min出荷先数], [Max出荷先数], [ベースI数], [Minアイテム数], [Maxアイテム数]) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
                Else
                    ' データがある場合は UPDATE
                    sql = "UPDATE My_DATA2 SET [データ抽出区分] = ?, [ETable] = ?, [ITable] = ?, [ランクキー] = ?, [キーLabel] = ?, [ベースE数] = ?, [Min出荷先数] = ?, [Max出荷先数] = ?, [ベースI数] = ?, [Minアイテム数] = ?, [Maxアイテム数] = ?"
                End If

                Using cmd As New OleDbCommand(sql, conn)
                    ' パラメータの順番は SQL文の ? の順番と一致させる
                    cmd.Parameters.AddWithValue("@p1", データ抽出区分)
                    cmd.Parameters.AddWithValue("@p2", ETable)
                    cmd.Parameters.AddWithValue("@p3", ITable)
                    cmd.Parameters.AddWithValue("@p4", ランクキー)
                    cmd.Parameters.AddWithValue("@p5", キーLabel)
                    cmd.Parameters.AddWithValue("@p6", ベースE数)
                    cmd.Parameters.AddWithValue("@p7", Min出荷先数)
                    cmd.Parameters.AddWithValue("@p8", Max出荷先数)
                    cmd.Parameters.AddWithValue("@p9", ベースI数)
                    cmd.Parameters.AddWithValue("@p10", Minアイテム数)
                    cmd.Parameters.AddWithValue("@p11", Maxアイテム数)

                    Dim rowsAffected As Integer = cmd.ExecuteNonQuery()
                    Console.WriteLine($"{rowsAffected} 件のデータを保存（更新/追加）しました。")
                End Using

            Catch ex As Exception
                Console.WriteLine("保存エラー: " & ex.Message)
            End Try
        End Using
    End Sub
    Public Sub My_DATA2読込()
        Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MyDB & ";"

        Using conn As New OleDbConnection(connStr)
            Try
                conn.Open()
                Dim sql As String = "SELECT * FROM My_DATA2"

                Using cmd As New OleDbCommand(sql, conn)
                    Using reader As OleDbDataReader = cmd.ExecuteReader()
                        ' 最初の1行のみを読み込む例
                        If reader.Read() Then
                            データ抽出区分 = If(IsDBNull(reader("データ抽出区分")), "", reader("データ抽出区分").ToString())
                            ETable = If(IsDBNull(reader("ETable")), "", reader("ETable").ToString())
                            ITable = If(IsDBNull(reader("ITable")), "", reader("ITable").ToString())
                            ランクキー = If(IsDBNull(reader("ランクキー")), "", reader("ランクキー").ToString())
                            キーLabel = If(IsDBNull(reader("キーLabel")), "", reader("キーLabel").ToString())
                            ベースE数 = Convert.ToInt32(reader("ベースE数"))
                            Min出荷先数 = Convert.ToInt32(reader("Min出荷先数"))
                            Max出荷先数 = Convert.ToInt32(reader("Max出荷先数"))
                            ベースI数 = Convert.ToInt32(reader("ベースI数"))
                            Minアイテム数 = Convert.ToInt32(reader("Minアイテム数"))
                            Maxアイテム数 = Convert.ToInt32(reader("Maxアイテム数"))
                            Console.WriteLine("読込成功")
                        Else
                            Console.WriteLine("データが存在しません。")
                        End If
                    End Using
                End Using

            Catch ex As Exception
                Console.WriteLine("読込エラー: " & ex.Message)
            End Try
        End Using
    End Sub
#End Region

    ' ========================================
    ' 定数定義
    ' ========================================
    Public 比率Min値 As Double = 50
    Public 比率Max値 As Double = 150
    Public ピッチMin値 As Double = 1
    Public ピッチMax値 As Double = 20
    Public ピッチ既定値 As Double = 5.9

    ' ========================================
    ' クラスレベル変数
    ' ========================================
    Public 継続計算可能Chk As Boolean = True
    Public 初期化完了フラグ As Boolean = False

    ' ========================================
    ' UI Controls (フォームデザイナーで定義されたコントロール)
    ' ========================================
    Friend WithEvents E4_機械学習Bt As Button

End Module
